//给定一个包含红色、白色和蓝色，一共 n 个元素的数组，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。 
//
// 此题中，我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 
//
// 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [2,0,2,1,1,0]
//输出：[0,0,1,1,2,2]
// 
//
// 示例 2： 
//
// 
//输入：nums = [2,0,1]
//输出：[0,1,2]
// 
//
// 示例 3： 
//
// 
//输入：nums = [0]
//输出：[0]
// 
//
// 示例 4： 
//
// 
//输入：nums = [1]
//输出：[1]
// 
//
// 
//
// 提示： 
//
// 
// n == nums.length 
// 1 <= n <= 300 
// nums[i] 为 0、1 或 2 
// 
//
// 
//
// 进阶： 
//
// 
// 你可以不使用代码库中的排序函数来解决这道题吗？ 
// 你能想出一个仅使用常数空间的一趟扫描算法吗？ 
// 
// Related Topics 数组 双指针 排序 👍 1074 👎 0

package leetcode.editor.cn;

import java.util.Arrays;

public class _75_SortColors {
    public static void main(String[] args) {
        int[] nums = new int[]{2,0,1};
        Solution solution = new _75_SortColors().new Solution();
        solution.sortColors(nums);
        System.out.println(Arrays.toString(nums));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public void sortColors(int[] nums) {
            int len = nums.length;
            if (len < 2) {
                return;
            }

            // all in [0, p0) == 0;
            // all in [p0, i) == 1;
            // all in (p2, len - 1] == 2;
            int p0 = 0;
            int i = 0;
            int p2 = len - 1;
            while (i <= p2) {
                if (nums[i] == 0) {
                    swap(nums, i++, p0++);
                } else if (nums[i] == 1) {
                    i++;
                } else {
                    swap(nums, i, p2--);
                }
            }
        }
        /**
         * 用的左的递归快排，有点搞复杂了
         * @param nums
         */
        public void sortColors_partition(int[] nums) {
            if (nums == null || nums.length < 2) {
                return;
            }
            quickSort(nums, 0, nums.length - 1);

        }
        public void quickSort(int[] nums, int l, int r) {
            if (l < r) {
                swap(nums, l + (int) (Math.random() * (r - l + 1)), r);
                int[] p = partition(nums, l, r);
                quickSort(nums, l, p[0] - 1);
                quickSort(nums, p[1] + 1, r);
            }
        }
        public int[] partition(int[] nums, int l, int r) {
            int less = l - 1;
            int more = r;
            while (l < more) {
                if (nums[l] < nums[r]) {
                    swap(nums, ++less, l++);
                } else if (nums[l] > nums[r]) {
                    swap(nums, --more, l);
                } else {
                    l++;
                }
            }
            swap(nums, r, more);//
            return new int[] {less + 1, more};
        }
        public void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
        /**
         * 废物，人家是荷兰国旗问题
         * @param nums
         */
        public void sortColors_shazi(int[] nums) {
            int num0 = 0;
            int num1 = 0;
            int num2 = 0;
            for(int num : nums) {
                if (num == 0) {
                    num0++;
                } else if (num == 1) {
                    num1++;
                } else {
                    num2++;
                }
            }
            for (int i = 0; i < num0; i++) {
                nums[i] = 0;
            }
            for (int i = 0; i < num1; i++) {
                nums[num0 + i]  = 1;
            }
            for (int i = 0; i < num2; i++) {
                nums[num0 + num1 + i] = 2;
            }
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}